package cn.vehicle.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.text.StringSubstitutor;

import java.util.Map;

/**
 * 字符串模板枚举类
 * <p>
 * 用于定义字符串模板的前缀与后缀符号规则，并提供模板占位符替换功能。
 * 可支持多种占位符格式，例如：
 * <ul>
 *   <li>`${key}`：常见的变量模板；</li>
 *   <li>`$[key]`：自定义变量模板。</li>
 * </ul>
 * </p>
 *
 * <p>主要功能：</p>
 * <ul>
 *   <li>定义模板的前后缀符号；</li>
 *   <li>基于 {@link org.apache.commons.text.StringSubstitutor} 实现模板变量替换；</li>
 *   <li>支持多种模板语法风格的灵活扩展。</li>
 * </ul>
 */
@Getter
@AllArgsConstructor
public enum StringTemplateEnum {

    bracket("${", "}"),

    brace("$[", "]");

    // 模板前缀符号，例如 "${" 或 "$["
    private final String prefix;

    // 模板后缀符号，例如 "}" 或 "]"
    private final String suffix;

    /**
     * 使用当前模板规则进行字符串变量替换
     * <p>
     * 将源字符串中的占位符（由前后缀包裹的变量名）替换为参数 Map 中对应的值。
     * </p>
     *
     * @param source 源字符串（包含模板占位符）
     * @param param  模板参数 Map，键为变量名，值为替换内容
     * @return 替换后的字符串结果
     */
    public String replace(String source, Map<String, Object> param) {
        // 创建字符串替换器对象，指定模板的前缀和后缀
        StringSubstitutor stringSubstitutor = new StringSubstitutor(param, prefix, suffix);
        // 执行模板替换操作并返回结果
        return stringSubstitutor.replace(source);
    }
}
